Generated by Cython 3.0.2
Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.
Raw output: noise_add_gaussians.c
+001: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=False, autogen_pxd=True
__pyx_t_11 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_11) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
002:
003: from libc.math cimport erf, sqrt
004:
005: from cython.parallel import prange
006:
+007: import numpy as np
__pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 7, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 7, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
008: cimport numpy as np
009:
+010: cdef double ROOT2 = sqrt(2)
__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_ROOT2 = sqrt(2.0);
+011: cdef double SIGMA_CUTTOFF = 4
__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_SIGMA_CUTTOFF = 4.0;
012:
013:
+014: def render_random_gaussians(width: int, height: int, nFrames: int, particles_per_slice: int,
/* Python wrapper */ static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_1render_random_gaussians(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_19noise_add_gaussians_render_random_gaussians, "\n Generate a stack of images with random particles\n :param width: the width of the image\n :param height: the height of the image\n :param nFrames: the number of frames in the stack\n :param particles_per_slice: the number of particles per frame\n :param amplitude: the amplitude of the particles\n :param sigma_x: the sigma of the particles in the x direction\n :param sigma_y: the sigma of the particles in the y direction\n :param particles_per_slice_randomness: the randomness of the number of particles per frame\n :param amplitude_randomness: the randomness of the amplitude of the particles\n :param sigma_x_randomness: the randomness of the sigma of the particles in the x direction\n :param sigma_y_randomness: the randomness of the sigma of the particles in the y direction\n :return: a stack of images with random particles\n "); static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_1render_random_gaussians = {"render_random_gaussians", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_1render_random_gaussians, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_19noise_add_gaussians_render_random_gaussians}; static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_1render_random_gaussians(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_width = 0; PyObject *__pyx_v_height = 0; PyObject *__pyx_v_nFrames = 0; PyObject *__pyx_v_particles_per_slice = 0; double __pyx_v_amplitude; double __pyx_v_sigma_x; double __pyx_v_sigma_y; double __pyx_v_particles_per_slice_randomness; double __pyx_v_amplitude_randomness; double __pyx_v_sigma_x_randomness; double __pyx_v_sigma_y_randomness; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_random_gaussians (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 14, __pyx_L3_error) #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_width,&__pyx_n_s_height,&__pyx_n_s_nFrames,&__pyx_n_s_particles_per_slice,&__pyx_n_s_amplitude,&__pyx_n_s_sigma_x,&__pyx_n_s_sigma_y,&__pyx_n_s_particles_per_slice_randomness,&__pyx_n_s_amplitude_randomness,&__pyx_n_s_sigma_x_randomness,&__pyx_n_s_sigma_y_randomness,0}; PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_FASTCALL(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_FASTCALL(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_width)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_height)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_random_gaussians", 0, 4, 11, 1); __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_nFrames)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_random_gaussians", 0, 4, 11, 2); __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particles_per_slice)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_random_gaussians", 0, 4, 11, 3); __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude); if (value) { values[4] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x); if (value) { values[5] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y); if (value) { values[6] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_particles_per_slice_randomness); if (value) { values[7] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude_randomness); if (value) { values[8] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x_randomness); if (value) { values[9] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 10: if (kw_args > 0) { PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y_randomness); if (value) { values[10] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_random_gaussians") < 0)) __PYX_ERR(0, 14, __pyx_L3_error) } } else { switch (__pyx_nargs) { case 11: values[10] = __Pyx_Arg_FASTCALL(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = __Pyx_Arg_FASTCALL(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = __Pyx_Arg_FASTCALL(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = __Pyx_Arg_FASTCALL(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_width = ((PyObject*)values[0]); __pyx_v_height = ((PyObject*)values[1]); __pyx_v_nFrames = ((PyObject*)values[2]); __pyx_v_particles_per_slice = ((PyObject*)values[3]); if (values[4]) { __pyx_v_amplitude = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_amplitude == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) } else { __pyx_v_amplitude = ((double)((double)1000.0)); } if (values[5]) { __pyx_v_sigma_x = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_sigma_x == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) } else { __pyx_v_sigma_x = ((double)((double)1.5)); } if (values[6]) { __pyx_v_sigma_y = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_sigma_y == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error) } else { __pyx_v_sigma_y = ((double)((double)1.5)); } if (values[7]) { __pyx_v_particles_per_slice_randomness = __pyx_PyFloat_AsDouble(values[7]); if (unlikely((__pyx_v_particles_per_slice_randomness == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 16, __pyx_L3_error) } else { __pyx_v_particles_per_slice_randomness = ((double)((double)0.25)); } if (values[8]) { __pyx_v_amplitude_randomness = __pyx_PyFloat_AsDouble(values[8]); if (unlikely((__pyx_v_amplitude_randomness == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 17, __pyx_L3_error) } else { __pyx_v_amplitude_randomness = ((double)((double)0.25)); } if (values[9]) { __pyx_v_sigma_x_randomness = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_sigma_x_randomness == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 18, __pyx_L3_error) } else { __pyx_v_sigma_x_randomness = ((double)((double)0.1)); } if (values[10]) { __pyx_v_sigma_y_randomness = __pyx_PyFloat_AsDouble(values[10]); if (unlikely((__pyx_v_sigma_y_randomness == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) } else { __pyx_v_sigma_y_randomness = ((double)((double)0.1)); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("render_random_gaussians", 0, 4, 11, __pyx_nargs); __PYX_ERR(0, 14, __pyx_L3_error) goto __pyx_L3_error; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_random_gaussians", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_width), (&PyInt_Type), 0, "width", 1))) __PYX_ERR(0, 14, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_height), (&PyInt_Type), 0, "height", 1))) __PYX_ERR(0, 14, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_nFrames), (&PyInt_Type), 0, "nFrames", 1))) __PYX_ERR(0, 14, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_particles_per_slice), (&PyInt_Type), 0, "particles_per_slice", 1))) __PYX_ERR(0, 14, __pyx_L1_error) __pyx_r = __pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_render_random_gaussians(__pyx_self, __pyx_v_width, __pyx_v_height, __pyx_v_nFrames, __pyx_v_particles_per_slice, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y, __pyx_v_particles_per_slice_randomness, __pyx_v_amplitude_randomness, __pyx_v_sigma_x_randomness, __pyx_v_sigma_y_randomness); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_render_random_gaussians(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_width, PyObject *__pyx_v_height, PyObject *__pyx_v_nFrames, PyObject *__pyx_v_particles_per_slice, double __pyx_v_amplitude, double __pyx_v_sigma_x, double __pyx_v_sigma_y, double __pyx_v_particles_per_slice_randomness, double __pyx_v_amplitude_randomness, double __pyx_v_sigma_x_randomness, double __pyx_v_sigma_y_randomness) { __Pyx_memviewslice __pyx_v_x_positions = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_y_positions = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_amplitudes = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_sigmas_x = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_sigmas_y = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_ims = { 0, 0, { 0 }, { 0 }, { 0 } }; int __pyx_v_n_particles; int __pyx_v_nf; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_random_gaussians", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __PYX_XCLEAR_MEMVIEW(&__pyx_t_6, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_t_11, 1); __Pyx_XDECREF(__pyx_t_12); __PYX_XCLEAR_MEMVIEW(&__pyx_t_13, 1); __Pyx_XDECREF(__pyx_t_14); __Pyx_XDECREF(__pyx_t_15); __Pyx_XDECREF(__pyx_t_16); __Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_random_gaussians", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XCLEAR_MEMVIEW(&__pyx_v_x_positions, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_y_positions, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_amplitudes, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigmas_x, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigmas_y, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_ims, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__23 = PyTuple_Pack(19, __pyx_n_s_width, __pyx_n_s_height, __pyx_n_s_nFrames, __pyx_n_s_particles_per_slice, __pyx_n_s_amplitude, __pyx_n_s_sigma_x, __pyx_n_s_sigma_y, __pyx_n_s_particles_per_slice_randomness, __pyx_n_s_amplitude_randomness, __pyx_n_s_sigma_x_randomness, __pyx_n_s_sigma_y_randomness, __pyx_n_s_x_positions, __pyx_n_s_y_positions, __pyx_n_s_amplitudes, __pyx_n_s_sigmas_x, __pyx_n_s_sigmas_y, __pyx_n_s_ims, __pyx_n_s_n_particles, __pyx_n_s_nf); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); /* … */ __pyx_t_13 = PyTuple_New(7); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); __Pyx_GIVEREF(__pyx_t_7); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_7)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_4); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_t_4)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_5); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_t_5)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_9); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_t_9)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_10); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_t_10)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_11); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_11)) __PYX_ERR(0, 14, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_12); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_13, 6, __pyx_t_12)) __PYX_ERR(0, 14, __pyx_L1_error); __pyx_t_7 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_12 = __Pyx_PyDict_NewPresized(11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_width, __pyx_n_s_int) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_height, __pyx_n_s_int) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_nFrames, __pyx_n_s_int) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_particles_per_slice, __pyx_n_s_int) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_amplitude, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_sigma_x, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_sigma_y, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_particles_per_slice_randomness, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_amplitude_randomness, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_sigma_x_randomness, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_sigma_y_randomness, __pyx_n_s_float) < 0) __PYX_ERR(0, 14, __pyx_L1_error) __pyx_t_11 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_1render_random_gaussians, 0, __pyx_n_s_render_random_gaussians, NULL, __pyx_n_s_nanopyx_core_generate_noise_add, __pyx_d, ((PyObject *)__pyx_codeobj__24)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_11, __pyx_t_13); __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_11, __pyx_t_12); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_random_gaussians, __pyx_t_11) < 0) __PYX_ERR(0, 14, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(11, 0, 0, 19, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_noise, __pyx_n_s_render_random_gaussians, 14, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) __PYX_ERR(0, 14, __pyx_L1_error)
+015: amplitude: float = 1000, sigma_x: float = 1.5, sigma_y: float = 1.5,
__pyx_t_7 = PyFloat_FromDouble(((double)1000.0)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = PyFloat_FromDouble(((double)1.5)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyFloat_FromDouble(((double)1.5)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5);
+016: particles_per_slice_randomness: float = 0.25,
__pyx_t_9 = PyFloat_FromDouble(((double)0.25)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 16, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9);
+017: amplitude_randomness: float = 0.25,
__pyx_t_10 = PyFloat_FromDouble(((double)0.25)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10);
+018: sigma_x_randomness: float = 0.1,
__pyx_t_11 = PyFloat_FromDouble(((double)0.1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 18, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11);
+019: sigma_y_randomness: float = 0.1):
__pyx_t_12 = PyFloat_FromDouble(((double)0.1)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12);
020: """
021: Generate a stack of images with random particles
022: :param width: the width of the image
023: :param height: the height of the image
024: :param nFrames: the number of frames in the stack
025: :param particles_per_slice: the number of particles per frame
026: :param amplitude: the amplitude of the particles
027: :param sigma_x: the sigma of the particles in the x direction
028: :param sigma_y: the sigma of the particles in the y direction
029: :param particles_per_slice_randomness: the randomness of the number of particles per frame
030: :param amplitude_randomness: the randomness of the amplitude of the particles
031: :param sigma_x_randomness: the randomness of the sigma of the particles in the x direction
032: :param sigma_y_randomness: the randomness of the sigma of the particles in the y direction
033: :return: a stack of images with random particles
034: """
035:
036: cdef double[:] x_positions, y_positions, amplitudes, sigmas_x, sigmas_y
+037: cdef float[:,:,:] ims = np.zeros((nFrames, height, width), dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_nFrames); __Pyx_GIVEREF(__pyx_v_nFrames); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_nFrames)) __PYX_ERR(0, 37, __pyx_L1_error); __Pyx_INCREF(__pyx_v_height); __Pyx_GIVEREF(__pyx_v_height); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_height)) __PYX_ERR(0, 37, __pyx_L1_error); __Pyx_INCREF(__pyx_v_width); __Pyx_GIVEREF(__pyx_v_width); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_width)) __PYX_ERR(0, 37, __pyx_L1_error); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_ims = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
038:
039: cdef int n_particles
040: cdef int nf
041:
+042: for nf in range(nFrames):
__pyx_t_7 = __Pyx_PyInt_As_long(__pyx_v_nFrames); if (unlikely((__pyx_t_7 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 42, __pyx_L1_error) __pyx_t_8 = __pyx_t_7; for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { __pyx_v_nf = __pyx_t_9;
+043: n_particles = int(particles_per_slice * (1 + np.random.uniform(-1, 1) * particles_per_slice_randomness))
__Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uniform); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyFloat_FromDouble(__pyx_v_particles_per_slice_randomness); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyInt_AddCObj(__pyx_int_1, __pyx_t_3, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Multiply(__pyx_v_particles_per_slice, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_10 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_n_particles = __pyx_t_10; /* … */ __pyx_tuple__11 = PyTuple_Pack(2, __pyx_int_neg_1, __pyx_int_1); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 43, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11);
+044: x_positions = np.random.uniform(0, width-1, n_particles)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_random); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_uniform); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Subtract(__pyx_v_width, __pyx_int_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_int_0, __pyx_t_1, __pyx_t_2}; __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __PYX_XCLEAR_MEMVIEW(&__pyx_v_x_positions, 1); __pyx_v_x_positions = __pyx_t_11; __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
+045: y_positions = np.random.uniform(0, height-1, n_particles)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_random); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_uniform); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Subtract(__pyx_v_height, __pyx_int_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_4, __pyx_int_0, __pyx_t_2, __pyx_t_1}; __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 45, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __PYX_XCLEAR_MEMVIEW(&__pyx_v_y_positions, 1); __pyx_v_y_positions = __pyx_t_11; __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
+046: sigmas_x = sigma_x * (1 + sigma_x_randomness * np.random.uniform(-1, 1, n_particles))
__pyx_t_5 = PyFloat_FromDouble(__pyx_v_sigma_x); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_sigma_x_randomness); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uniform); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_12 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_12); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_12, __pyx_int_neg_1, __pyx_int_1, __pyx_t_4}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_t_2 = PyNumber_Multiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_AddCObj(__pyx_int_1, __pyx_t_2, 1, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Multiply(__pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigmas_x, 1); __pyx_v_sigmas_x = __pyx_t_11; __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
+047: sigmas_y = sigma_y * (1 + sigma_y_randomness * np.random.uniform(-1, 1, n_particles))
__pyx_t_2 = PyFloat_FromDouble(__pyx_v_sigma_y); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_sigma_y_randomness); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uniform); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_12 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_12); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_12, __pyx_int_neg_1, __pyx_int_1, __pyx_t_4}; __pyx_t_5 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyInt_AddCObj(__pyx_int_1, __pyx_t_3, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Multiply(__pyx_t_2, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_3, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 47, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigmas_y, 1); __pyx_v_sigmas_y = __pyx_t_11; __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
+048: amplitudes = amplitude * (1 + amplitude_randomness * np.random.uniform(-1, 1, n_particles))
__pyx_t_3 = PyFloat_FromDouble(__pyx_v_amplitude); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyFloat_FromDouble(__pyx_v_amplitude_randomness); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_random); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_uniform); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_particles); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_12 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (likely(PyMethod_Check(__pyx_t_1))) { __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_12)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_12); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[4] = {__pyx_t_12, __pyx_int_neg_1, __pyx_int_1, __pyx_t_4}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_10, 3+__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __pyx_t_1 = PyNumber_Multiply(__pyx_t_5, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_AddCObj(__pyx_int_1, __pyx_t_1, 1, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyNumber_Multiply(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_11 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_11.memview)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __PYX_XCLEAR_MEMVIEW(&__pyx_v_amplitudes, 1); __pyx_v_amplitudes = __pyx_t_11; __pyx_t_11.memview = NULL; __pyx_t_11.data = NULL;
+049: render_gaussians(ims[nf], x_positions, y_positions, amplitudes, sigmas_x, sigmas_y)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_render_gaussians); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_13.data = __pyx_v_ims.data; __pyx_t_13.memview = __pyx_v_ims.memview; __PYX_INC_MEMVIEW(&__pyx_t_13, 1); { Py_ssize_t __pyx_tmp_idx = __pyx_v_nf; Py_ssize_t __pyx_tmp_stride = __pyx_v_ims.strides[0]; __pyx_t_13.data += __pyx_tmp_idx * __pyx_tmp_stride; } __pyx_t_13.shape[0] = __pyx_v_ims.shape[1]; __pyx_t_13.strides[0] = __pyx_v_ims.strides[1]; __pyx_t_13.suboffsets[0] = -1; __pyx_t_13.shape[1] = __pyx_v_ims.shape[2]; __pyx_t_13.strides[1] = __pyx_v_ims.strides[2]; __pyx_t_13.suboffsets[1] = -1; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_t_13, 2, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __PYX_XCLEAR_MEMVIEW(&__pyx_t_13, 1); __pyx_t_13.memview = NULL; __pyx_t_13.data = NULL; __pyx_t_5 = __pyx_memoryview_fromslice(__pyx_v_x_positions, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_y_positions, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_12 = __pyx_memoryview_fromslice(__pyx_v_amplitudes, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_t_14 = __pyx_memoryview_fromslice(__pyx_v_sigmas_x, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_14); __pyx_t_15 = __pyx_memoryview_fromslice(__pyx_v_sigmas_y, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); __pyx_t_16 = NULL; __pyx_t_10 = 0; #if CYTHON_UNPACK_METHODS if (unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_16 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_16)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_16); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_10 = 1; } } #endif { PyObject *__pyx_callargs[7] = {__pyx_t_16, __pyx_t_3, __pyx_t_5, __pyx_t_4, __pyx_t_12, __pyx_t_14, __pyx_t_15}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_10, 6+__pyx_t_10); __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; }
050:
+051: return ims
__Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_ims, 3, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0;
052:
053:
+054: def render_gaussians(float[:,:] image, double[:] x, double[:] y, double[:] amplitude, double[:] sigma_x, double[:] sigma_y):
/* Python wrapper */ static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_3render_gaussians(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_19noise_add_gaussians_2render_gaussians, "\n Render a set of gaussian particles on an image using the error function (erf) to calculate the integral of the gaussian\n :param image: the image to render the particles on\n :param xp: the x position of the center of the gaussian\n :param yp: the y position of the center of the gaussian\n :param amplitude: the amplitude of the gaussian\n :param sigma_x: the sigma of the gaussian in the x direction\n :param sigma_y: the sigma of the gaussian in the y direction\n :return: the image with the particles rendered on it\n\n Original implementation: https://github.com/HenriquesLab/NanoJ-Core/blob/80020c9cf5ecac70019daa5731d0c296cb306ac4/Core/src/nanoj/core/java/image/rendering/SubPixelGaussianRendering.java#L12\n "); static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_3render_gaussians = {"render_gaussians", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_3render_gaussians, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_19noise_add_gaussians_2render_gaussians}; static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_3render_gaussians(PyObject *__pyx_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { __Pyx_memviewslice __pyx_v_image = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_x = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_y = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_amplitude = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_sigma_x = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_sigma_y = { 0, 0, { 0 }, { 0 }, { 0 } }; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_gaussians (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 54, __pyx_L3_error) #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image,&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_amplitude,&__pyx_n_s_sigma_x,&__pyx_n_s_sigma_y,0}; PyObject* values[6] = {0,0,0,0,0,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_x)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, 1); __PYX_ERR(0, 54, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_y)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, 2); __PYX_ERR(0, 54, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, 3); __PYX_ERR(0, 54, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, 4); __PYX_ERR(0, 54, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[5]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, 5); __PYX_ERR(0, 54, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_gaussians") < 0)) __PYX_ERR(0, 54, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 6)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5); } __pyx_v_image = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_image.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_x = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_x.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_y = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_y.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_amplitude = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_amplitude.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_sigma_x = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sigma_x.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_sigma_y = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[5], PyBUF_WRITABLE); if (unlikely(!__pyx_v_sigma_y.memview)) __PYX_ERR(0, 54, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("render_gaussians", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 54, __pyx_L3_error) goto __pyx_L3_error; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __PYX_XCLEAR_MEMVIEW(&__pyx_v_image, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_x, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_y, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_amplitude, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigma_x, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigma_y, 1); __Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_gaussians", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_2render_gaussians(__pyx_self, __pyx_v_image, __pyx_v_x, __pyx_v_y, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ __PYX_XCLEAR_MEMVIEW(&__pyx_v_image, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_x, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_y, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_amplitude, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigma_x, 1); __PYX_XCLEAR_MEMVIEW(&__pyx_v_sigma_y, 1); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_2render_gaussians(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_image, __Pyx_memviewslice __pyx_v_x, __Pyx_memviewslice __pyx_v_y, __Pyx_memviewslice __pyx_v_amplitude, __Pyx_memviewslice __pyx_v_sigma_x, __Pyx_memviewslice __pyx_v_sigma_y) { int __pyx_v_p; CYTHON_UNUSED int __pyx_v_nParticles; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("render_gaussians", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1); __Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_gaussians", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__25 = PyTuple_Pack(8, __pyx_n_s_image, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_amplitude, __pyx_n_s_sigma_x, __pyx_n_s_sigma_y, __pyx_n_s_p, __pyx_n_s_nParticles); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__25); __Pyx_GIVEREF(__pyx_tuple__25); /* … */ __pyx_t_11 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_3render_gaussians, 0, __pyx_n_s_render_gaussians, NULL, __pyx_n_s_nanopyx_core_generate_noise_add, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 54, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_gaussians, __pyx_t_11) < 0) __PYX_ERR(0, 54, __pyx_L1_error) __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(6, 0, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_noise, __pyx_n_s_render_gaussians, 54, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 54, __pyx_L1_error)
055: """
056: Render a set of gaussian particles on an image using the error function (erf) to calculate the integral of the gaussian
057: :param image: the image to render the particles on
058: :param xp: the x position of the center of the gaussian
059: :param yp: the y position of the center of the gaussian
060: :param amplitude: the amplitude of the gaussian
061: :param sigma_x: the sigma of the gaussian in the x direction
062: :param sigma_y: the sigma of the gaussian in the y direction
063: :return: the image with the particles rendered on it
064:
065: Original implementation: https://github.com/HenriquesLab/NanoJ-Core/blob/80020c9cf5ecac70019daa5731d0c296cb306ac4/Core/src/nanoj/core/java/image/rendering/SubPixelGaussianRendering.java#L12
066: """
067:
068: cdef int p
+069: cdef int nParticles = amplitude.shape[0]
__pyx_v_nParticles = (__pyx_v_amplitude.shape[0]);
070:
+071: with nogil:
{
#ifdef WITH_THREAD
PyThreadState *_save;
_save = NULL;
Py_UNBLOCK_THREADS
__Pyx_FastGIL_Remember();
#endif
/*try:*/ {
/* … */
/*finally:*/ {
/*normal exit:*/{
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L5;
}
__pyx_L4_error: {
#ifdef WITH_THREAD
__Pyx_FastGIL_Forget();
Py_BLOCK_THREADS
#endif
goto __pyx_L1_error;
}
__pyx_L5:;
}
}
+072: for p in prange(nParticles):
__pyx_t_1 = __pyx_v_nParticles;
{
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) (x)
#define unlikely(x) (x)
#endif
__pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
if (__pyx_t_3 > 0)
{
#ifdef _OPENMP
#pragma omp parallel
#endif /* _OPENMP */
{
#ifdef _OPENMP
#pragma omp for firstprivate(__pyx_v_p) lastprivate(__pyx_v_p)
#endif /* _OPENMP */
for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){
{
__pyx_v_p = (int)(0 + 1 * __pyx_t_2);
+073: _render_erf_gaussian(image, x[p], y[p], amplitude[p], sigma_x[p], sigma_y[p])
__pyx_t_4 = __pyx_v_p;
__pyx_t_5 = __pyx_v_p;
__pyx_t_6 = __pyx_v_p;
__pyx_t_7 = __pyx_v_p;
__pyx_t_8 = __pyx_v_p;
__pyx_t_9 = __pyx_f_7nanopyx_4core_8generate_19noise_add_gaussians__render_erf_gaussian(__pyx_v_image, (*((double *) ( /* dim=0 */ (__pyx_v_x.data + __pyx_t_4 * __pyx_v_x.strides[0]) ))), (*((double *) ( /* dim=0 */ (__pyx_v_y.data + __pyx_t_5 * __pyx_v_y.strides[0]) ))), (*((double *) ( /* dim=0 */ (__pyx_v_amplitude.data + __pyx_t_6 * __pyx_v_amplitude.strides[0]) ))), (*((double *) ( /* dim=0 */ (__pyx_v_sigma_x.data + __pyx_t_7 * __pyx_v_sigma_x.strides[0]) ))), (*((double *) ( /* dim=0 */ (__pyx_v_sigma_y.data + __pyx_t_8 * __pyx_v_sigma_y.strides[0]) )))); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 73, __pyx_L8_error)
__PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 0);
__pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
goto __pyx_L11;
__pyx_L8_error:;
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_exc_type)
#endif /* _OPENMP */
if (!__pyx_parallel_exc_type) {
__Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb);
__pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno;
__Pyx_GOTREF(__pyx_parallel_exc_type);
}
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
__pyx_parallel_why = 4;
goto __pyx_L10;
__pyx_L10:;
#ifdef _OPENMP
#pragma omp critical(__pyx_parallel_lastprivates0)
#endif /* _OPENMP */
{
__pyx_parallel_temp0 = __pyx_v_p;
}
__pyx_L11:;
#ifdef _OPENMP
#pragma omp flush(__pyx_parallel_why)
#endif /* _OPENMP */
}
}
#ifdef _OPENMP
Py_END_ALLOW_THREADS
#else
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
#endif /* _OPENMP */
/* Clean up any temporaries */
__PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 0);
__pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
#ifndef _OPENMP
}
#endif /* _OPENMP */
}
}
if (__pyx_parallel_exc_type) {
/* This may have been overridden by a continue, break or return in another thread. Prefer the error. */
__pyx_parallel_why = 4;
}
if (__pyx_parallel_why) {
__pyx_v_p = __pyx_parallel_temp0;
switch (__pyx_parallel_why) {
case 4:
{
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
__Pyx_GIVEREF(__pyx_parallel_exc_type);
__Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb);
__pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno;
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
goto __pyx_L4_error;
}
}
}
#if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
#undef likely
#undef unlikely
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
}
074:
075:
+076: cdef float[:,:] _render_erf_gaussian(float[:,:] image, double xp, double yp, double amplitude, double sigma_x, double sigma_y) nogil:
static __Pyx_memviewslice __pyx_f_7nanopyx_4core_8generate_19noise_add_gaussians__render_erf_gaussian(__Pyx_memviewslice __pyx_v_image, double __pyx_v_xp, double __pyx_v_yp, double __pyx_v_amplitude, double __pyx_v_sigma_x, double __pyx_v_sigma_y) {
int __pyx_v_w;
int __pyx_v_h;
double __pyx_v_sx2;
double __pyx_v_sy2;
int __pyx_v_x_start;
int __pyx_v_x_end;
int __pyx_v_y_start;
int __pyx_v_y_end;
int __pyx_v_i;
int __pyx_v_j;
double __pyx_v_Ex;
double __pyx_v_Ey;
__Pyx_memviewslice __pyx_r = { 0, 0, { 0 }, { 0 }, { 0 } };
/* … */
/* function exit code */
__pyx_L0:;
if (unlikely(!__pyx_r.memview)) {
#ifdef WITH_THREAD
PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
#endif
PyErr_SetString(PyExc_TypeError, "Memoryview return value is not initialized");
#ifdef WITH_THREAD
__Pyx_PyGILState_Release(__pyx_gilstate_save);
#endif
}
return __pyx_r;
}
077: """
078: Render a gaussian particle on an image using the error function (erf) to calculate the integral of the gaussian
079: :param image: the image to render the particles on
080: :param xp: the x position of the center of the gaussian
081: :param yp: the y position of the center of the gaussian
082: :param amplitude: the intensity of each particle
083: :param sigma_x: the sigma of the gaussian in the x direction
084: :param sigma_y: the sigma of the gaussian in the y direction
085: """
086:
+087: cdef int w = image.shape[1]
__pyx_v_w = (__pyx_v_image.shape[1]);
+088: cdef int h = image.shape[0]
__pyx_v_h = (__pyx_v_image.shape[0]);
089:
+090: cdef double sx2 = ROOT2 * sigma_x # 2 * pow(sigmaX, 2)
__pyx_v_sx2 = (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_ROOT2 * __pyx_v_sigma_x);
+091: cdef double sy2 = ROOT2 * sigma_y # 2 * pow(sigmaY, 2)
__pyx_v_sy2 = (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_ROOT2 * __pyx_v_sigma_y);
092:
+093: cdef int x_start = max(<int>(xp - SIGMA_CUTTOFF * sigma_x), 0)
__pyx_t_1 = 0;
__pyx_t_2 = ((int)(__pyx_v_xp - (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_SIGMA_CUTTOFF * __pyx_v_sigma_x)));
__pyx_t_4 = (__pyx_t_1 > __pyx_t_2);
if (__pyx_t_4) {
__pyx_t_3 = __pyx_t_1;
} else {
__pyx_t_3 = __pyx_t_2;
}
__pyx_v_x_start = __pyx_t_3;
+094: cdef int x_end = min(<int>(xp + SIGMA_CUTTOFF * sigma_x + 2), w) # plus 2 because <int> rounds down and range end in max_value - 1
__pyx_t_2 = __pyx_v_w;
__pyx_t_5 = ((int)((__pyx_v_xp + (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_SIGMA_CUTTOFF * __pyx_v_sigma_x)) + 2.0));
__pyx_t_4 = (__pyx_t_2 < __pyx_t_5);
if (__pyx_t_4) {
__pyx_t_6 = __pyx_t_2;
} else {
__pyx_t_6 = __pyx_t_5;
}
__pyx_v_x_end = __pyx_t_6;
+095: cdef int y_start = max(<int>(yp - SIGMA_CUTTOFF * sigma_y), 0)
__pyx_t_3 = 0;
__pyx_t_6 = ((int)(__pyx_v_yp - (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_SIGMA_CUTTOFF * __pyx_v_sigma_y)));
__pyx_t_4 = (__pyx_t_3 > __pyx_t_6);
if (__pyx_t_4) {
__pyx_t_1 = __pyx_t_3;
} else {
__pyx_t_1 = __pyx_t_6;
}
__pyx_v_y_start = __pyx_t_1;
+096: cdef int y_end = min(<int>(yp + SIGMA_CUTTOFF * sigma_y + 2), h) # plus 2 because <int> rounds down and range end in max_value - 1
__pyx_t_6 = __pyx_v_h;
__pyx_t_2 = ((int)((__pyx_v_yp + (__pyx_v_7nanopyx_4core_8generate_19noise_add_gaussians_SIGMA_CUTTOFF * __pyx_v_sigma_y)) + 2.0));
__pyx_t_4 = (__pyx_t_6 < __pyx_t_2);
if (__pyx_t_4) {
__pyx_t_5 = __pyx_t_6;
} else {
__pyx_t_5 = __pyx_t_2;
}
__pyx_v_y_end = __pyx_t_5;
097:
098: cdef int i, j
099: cdef double Ex, Ey
100:
101: # based on Smith et al, Nath Meth, 2010: Fast, single-molecule localization that achieves theoretically
102: # minimum uncertainty (see Sup Mat page 10)
103: # note, the paper has an error on their formula 4a and 4b, 2sigma^2 should be sqrt(2)*sigma
104: # see REF: https://en.wikipedia.org/wiki/Normal_distribution formula 'Cumulative distribution function'
105:
+106: for j in range(y_start, y_end):
__pyx_t_5 = __pyx_v_y_end;
__pyx_t_6 = __pyx_t_5;
for (__pyx_t_2 = __pyx_v_y_start; __pyx_t_2 < __pyx_t_6; __pyx_t_2+=1) {
__pyx_v_j = __pyx_t_2;
+107: Ey = 0.5 * (erf((j + 0.5 - yp) / sy2) - erf((j - 0.5 - yp) / sy2))
__pyx_v_Ey = (0.5 * (erf((((__pyx_v_j + 0.5) - __pyx_v_yp) / __pyx_v_sy2)) - erf((((__pyx_v_j - 0.5) - __pyx_v_yp) / __pyx_v_sy2))));
+108: for i in range(x_start, x_end):
__pyx_t_7 = __pyx_v_x_end;
__pyx_t_8 = __pyx_t_7;
for (__pyx_t_9 = __pyx_v_x_start; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
__pyx_v_i = __pyx_t_9;
+109: Ex = 0.5 * (erf((i + 0.5 - xp) / sx2) - erf((i - 0.5 - xp) / sx2))
__pyx_v_Ex = (0.5 * (erf((((__pyx_v_i + 0.5) - __pyx_v_xp) / __pyx_v_sx2)) - erf((((__pyx_v_i - 0.5) - __pyx_v_xp) / __pyx_v_sx2))));
+110: image[j,i] += amplitude * Ex * Ey
__pyx_t_10 = __pyx_v_j;
__pyx_t_11 = __pyx_v_i;
*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_image.data + __pyx_t_10 * __pyx_v_image.strides[0]) ) + __pyx_t_11 * __pyx_v_image.strides[1]) )) += ((__pyx_v_amplitude * __pyx_v_Ex) * __pyx_v_Ey);
}
}
111:
+112: return image
__PYX_INC_MEMVIEW(&__pyx_v_image, 0); __pyx_r = __pyx_v_image; goto __pyx_L0;
113:
+114: def render_erf_gaussian(image, xp, yp, amplitude, sigma_x, sigma_y):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_5render_erf_gaussian(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_5render_erf_gaussian = {"render_erf_gaussian", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_5render_erf_gaussian, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_7nanopyx_4core_8generate_19noise_add_gaussians_5render_erf_gaussian(PyObject *__pyx_self,
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
PyObject *__pyx_v_image = 0;
PyObject *__pyx_v_xp = 0;
PyObject *__pyx_v_yp = 0;
PyObject *__pyx_v_amplitude = 0;
PyObject *__pyx_v_sigma_x = 0;
PyObject *__pyx_v_sigma_y = 0;
#if !CYTHON_METH_FASTCALL
CYTHON_UNUSED Py_ssize_t __pyx_nargs;
#endif
CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
PyObject *__pyx_r = 0;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("render_erf_gaussian (wrapper)", 0);
#if !CYTHON_METH_FASTCALL
#if CYTHON_ASSUME_SAFE_MACROS
__pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
#else
__pyx_nargs = PyTuple_Size(__pyx_args);
if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 114, __pyx_L3_error)
#endif
#endif
__pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
{
PyObject **__pyx_pyargnames[] = {&__pyx_n_s_image,&__pyx_n_s_xp,&__pyx_n_s_yp,&__pyx_n_s_amplitude,&__pyx_n_s_sigma_x,&__pyx_n_s_sigma_y,0};
PyObject* values[6] = {0,0,0,0,0,0};
if (__pyx_kwds) {
Py_ssize_t kw_args;
switch (__pyx_nargs) {
case 6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
CYTHON_FALLTHROUGH;
case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
CYTHON_FALLTHROUGH;
case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
CYTHON_FALLTHROUGH;
case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
CYTHON_FALLTHROUGH;
case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
CYTHON_FALLTHROUGH;
case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
CYTHON_FALLTHROUGH;
case 0: break;
default: goto __pyx_L5_argtuple_error;
}
kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
switch (__pyx_nargs) {
case 0:
if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_image)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else goto __pyx_L5_argtuple_error;
CYTHON_FALLTHROUGH;
case 1:
if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_xp)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, 1); __PYX_ERR(0, 114, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 2:
if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_yp)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[2]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, 2); __PYX_ERR(0, 114, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 3:
if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[3]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, 3); __PYX_ERR(0, 114, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 4:
if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_x)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[4]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, 4); __PYX_ERR(0, 114, __pyx_L3_error)
}
CYTHON_FALLTHROUGH;
case 5:
if (likely((values[5] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_sigma_y)) != 0)) {
(void)__Pyx_Arg_NewRef_FASTCALL(values[5]);
kw_args--;
}
else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L3_error)
else {
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, 5); __PYX_ERR(0, 114, __pyx_L3_error)
}
}
if (unlikely(kw_args > 0)) {
const Py_ssize_t kwd_pos_args = __pyx_nargs;
if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "render_erf_gaussian") < 0)) __PYX_ERR(0, 114, __pyx_L3_error)
}
} else if (unlikely(__pyx_nargs != 6)) {
goto __pyx_L5_argtuple_error;
} else {
values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
}
__pyx_v_image = values[0];
__pyx_v_xp = values[1];
__pyx_v_yp = values[2];
__pyx_v_amplitude = values[3];
__pyx_v_sigma_x = values[4];
__pyx_v_sigma_y = values[5];
}
goto __pyx_L4_argument_unpacking_done;
__pyx_L5_argtuple_error:;
__Pyx_RaiseArgtupleInvalid("render_erf_gaussian", 1, 6, 6, __pyx_nargs); __PYX_ERR(0, 114, __pyx_L3_error)
goto __pyx_L3_error;
__pyx_L3_error:;
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_erf_gaussian", __pyx_clineno, __pyx_lineno, __pyx_filename);
__Pyx_RefNannyFinishContext();
return NULL;
__pyx_L4_argument_unpacking_done:;
__pyx_r = __pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_4render_erf_gaussian(__pyx_self, __pyx_v_image, __pyx_v_xp, __pyx_v_yp, __pyx_v_amplitude, __pyx_v_sigma_x, __pyx_v_sigma_y);
int __pyx_lineno = 0;
const char *__pyx_filename = NULL;
int __pyx_clineno = 0;
/* function exit code */
{
Py_ssize_t __pyx_temp;
for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
__Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
}
}
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
static PyObject *__pyx_pf_7nanopyx_4core_8generate_19noise_add_gaussians_4render_erf_gaussian(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_image, PyObject *__pyx_v_xp, PyObject *__pyx_v_yp, PyObject *__pyx_v_amplitude, PyObject *__pyx_v_sigma_x, PyObject *__pyx_v_sigma_y) {
PyObject *__pyx_r = NULL;
__Pyx_RefNannyDeclarations
__Pyx_RefNannySetupContext("render_erf_gaussian", 0);
__Pyx_INCREF(__pyx_v_image);
/* … */
/* function exit code */
__pyx_L1_error:;
__Pyx_XDECREF(__pyx_t_1);
__Pyx_XDECREF(__pyx_t_2);
__Pyx_XDECREF(__pyx_t_3);
__Pyx_XDECREF(__pyx_t_4);
__Pyx_XDECREF(__pyx_t_5);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_6, 1);
__PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 1);
__Pyx_AddTraceback("nanopyx.core.generate.noise_add_gaussians.render_erf_gaussian", __pyx_clineno, __pyx_lineno, __pyx_filename);
__pyx_r = NULL;
__pyx_L0:;
__Pyx_XDECREF(__pyx_v_image);
__Pyx_XGIVEREF(__pyx_r);
__Pyx_RefNannyFinishContext();
return __pyx_r;
}
/* … */
__pyx_tuple__27 = PyTuple_Pack(6, __pyx_n_s_image, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_amplitude, __pyx_n_s_sigma_x, __pyx_n_s_sigma_y); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 114, __pyx_L1_error)
__Pyx_GOTREF(__pyx_tuple__27);
__Pyx_GIVEREF(__pyx_tuple__27);
/* … */
__pyx_t_11 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_19noise_add_gaussians_5render_erf_gaussian, 0, __pyx_n_s_render_erf_gaussian, NULL, __pyx_n_s_nanopyx_core_generate_noise_add, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 114, __pyx_L1_error)
__Pyx_GOTREF(__pyx_t_11);
if (PyDict_SetItem(__pyx_d, __pyx_n_s_render_erf_gaussian, __pyx_t_11) < 0) __PYX_ERR(0, 114, __pyx_L1_error)
__Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+115: image = np.asarray(image, dtype=np.float32)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_image); __Pyx_GIVEREF(__pyx_v_image); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_image)) __PYX_ERR(0, 115, __pyx_L1_error); __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 115, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF_SET(__pyx_v_image, __pyx_t_5); __pyx_t_5 = 0;
+116: return _render_erf_gaussian(image, xp, yp, amplitude, sigma_x, sigma_y)
__Pyx_XDECREF(__pyx_r); __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(__pyx_v_image, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_7 = __pyx_PyFloat_AsDouble(__pyx_v_xp); if (unlikely((__pyx_t_7 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_v_yp); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_9 = __pyx_PyFloat_AsDouble(__pyx_v_amplitude); if (unlikely((__pyx_t_9 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_10 = __pyx_PyFloat_AsDouble(__pyx_v_sigma_x); if (unlikely((__pyx_t_10 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_11 = __pyx_PyFloat_AsDouble(__pyx_v_sigma_y); if (unlikely((__pyx_t_11 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L1_error) __pyx_t_12 = __pyx_f_7nanopyx_4core_8generate_19noise_add_gaussians__render_erf_gaussian(__pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_12.memview)) __PYX_ERR(0, 116, __pyx_L1_error) __PYX_XCLEAR_MEMVIEW(&__pyx_t_6, 1); __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL; __pyx_t_5 = __pyx_memoryview_fromslice(__pyx_t_12, 2, (PyObject *(*)(char *)) __pyx_memview_get_float, (int (*)(char *, PyObject *)) __pyx_memview_set_float, 0);; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __PYX_XCLEAR_MEMVIEW(&__pyx_t_12, 1); __pyx_t_12.memview = NULL; __pyx_t_12.data = NULL; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0;